package com.optimus.db.dao.impl;

import com.optimus.common.cvo.CampanaVOList;
import com.optimus.common.util.ApplicationException;
import com.optimus.common.vo.CampanaVO;
import com.optimus.db.QueryFactory;
import com.optimus.db.dao.CampanaDAO;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author victor
 */
public class CampanaDAOImpl extends BaseDAO implements CampanaDAO {

    private static  Logger logger = LoggerFactory.getLogger(CampanaDAOImpl.class);

    public CampanaDAOImpl(){
        super();
    }

    public CampanaVOList listar(CampanaVO pruebaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        CampanaVOList result = new CampanaVOList();
        result.setLista(new ArrayList<CampanaVO>());
        result.setTicket(pruebaVO.getTicket());
        CampanaVO item = null;
        Long tk = result.getTicket();
        try {
            String queryStr=QueryFactory.instance().query("campana_listar", pruebaVO.getTicket());
            logParams[0] = queryStr;
            checkSession();
            session.beginTransaction();
            SQLQuery query = session.createSQLQuery(queryStr);
            Object objList = query.list();
            Object[] itemObj = null;
            for (Object obj : (List) objList) {
                itemObj = (Object[]) obj;
                item = new CampanaVO();
                item.setIdCampanaRecoleccion(getInteger(itemObj[0], null, tk));
                item.setDescripcion(getString(itemObj[1], null, tk));
                item.setT(getString(itemObj[3], null, tk));
                item.setEstadoRegistro(getString(itemObj[2], null, tk));
                result.getLista().add(item);
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return result;
    }
    
    public CampanaVOList listarActiva(CampanaVO pruebaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        CampanaVOList result = new CampanaVOList();
        result.setLista(new ArrayList<CampanaVO>());
        result.setTicket(pruebaVO.getTicket());
        CampanaVO item = null;
        Long tk = result.getTicket();
        try {
            String queryStr=QueryFactory.instance().query("campana_listar_activa", pruebaVO.getTicket());
            logParams[0] = queryStr;
            checkSession();
            session.beginTransaction();
            SQLQuery query = session.createSQLQuery(queryStr);
            Object objList = query.list();
            Object[] itemObj = null;
            for (Object obj : (List) objList) {
                itemObj = (Object[]) obj;
                item = new CampanaVO();
                item.setIdCampanaRecoleccion(getInteger(itemObj[0], null, tk));
                item.setDescripcion(getString(itemObj[1], null, tk));
                item.setT(getString(itemObj[3], null, tk));
                item.setEstadoRegistro(getString(itemObj[2], null, tk));
                result.getLista().add(item);
            }
            session.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return result;
    }

    public CampanaVO insertar(CampanaVO campanaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        CampanaVOList result = new CampanaVOList();
        result.setLista(new ArrayList<CampanaVO>());
        Long tk = result.getTicket();
        result.setTicket(tk);
        CampanaVO item = null;
        try {
            //Obtiene la query que esta dentro de com.optimus.db.query debe ser un archivo
            //sql de la forma tabla_operacion.sql tabla: nombre de la tabla, operacion uno de insertar,listar,actualizar,eliminar, u otro especifico
            //en dicho sql esta la query que queremos que se ejecute.
            String queryStr=QueryFactory.instance().query("campana_insertar", tk);
            logParams[0] = queryStr;
            //Crear una session
            Session session_db= session();
            //Abrir la transaccion
            session_db.beginTransaction();
            //Crear la query con parametros
            SQLQuery query = session_db.createSQLQuery(queryStr);
            //Llenar parametros
            query.setInteger(":idcampanarecoleccion", campanaVO.getIdCampanaRecoleccion());
            query.setString(":t", campanaVO.getT());
            query.setDate(":fechainicio", campanaVO.getFechaInicio());
            query.setDate(":fechafin", campanaVO.getFechaFin());
            query.setString(":idusuario", campanaVO.getIdUsuario());
            query.setString(":estadoregistro", campanaVO.getEstadoRegistro());
            query.setString(":descripcion", campanaVO.getDescripcion());
            //Ejecutar
            Integer objList = query.executeUpdate();
            session_db.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return campanaVO;
    }

    public CampanaVO actualizar(CampanaVO campanaVO) throws ApplicationException {

        //Llenar los los parametros para llamar a la query
        //llamar  a la query de actualizacion
        //Los pasos analogos a como se haría con insertar.
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public CampanaVO eliminar(CampanaVO campanaVO) throws ApplicationException {
        //Llenar los los parametros para llamar a la query
        //llamar  a la query de eliminacion
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
